/*
 * KararFabrikasi.java
 */
package eDoktor.kararMekanizmasi;

import eDoktor.hastalik.Hastalik;
import eDoktor.hastalikGrubu.Cevap;
import java.util.Map;


/**
 * Karar stratejisini belirleyen sınıf
 * @author Onuralp
 */
public class KararFabrikasi {
    private static KararFabrikasi ornek = null;
    private static Object kilit = new Object();
    private EnGuvenilirKararStratejisi strateji;

    /**
     * KararFabrikasi sınıfının yapılandırıcısı
     */
    private KararFabrikasi() {
    }
    
    /**
     * KararFabrikasi sınıfına erişmeyi sağlayan metod.
     * @return KararFabrikasi referansı
     */
    public static KararFabrikasi ornekOlustur() {
        if (ornek == null) {
            synchronized (kilit) {
                if (ornek == null) {
                    ornek = new KararFabrikasi();
                }
            }
        }
        return ornek;
    }

    /**
     * KararFabrikasi sınıfının degiskenlerine erişmeyi sağlayan fonksiyonlar 
     */

    public static Object getKilit() {
        return kilit;
    }

    public static void setKilit(Object kilit) {
        KararFabrikasi.kilit = kilit;
    }

    public static KararFabrikasi getOrnek() {
        return ornek;
    }

    public static void setOrnek(KararFabrikasi ornek) {
        KararFabrikasi.ornek = ornek;
    }

    public EnGuvenilirKararStratejisi getStrateji() {
        return strateji;
    }

    public void setStrateji(EnGuvenilirKararStratejisi strateji) {
        this.strateji = strateji;
    }
    
    /**
     * Karar mekanizmasını çalıştır.
     * @param vaka Vaka
     * @param hastalik Hastalık 
     * @return Hastalığın görülme ihtimali
     */
    public double kararMekanizmasiniCalistir(Map<String, Cevap> vaka, Hastalik hastalik) {
        strateji = new EnGuvenilirKararStratejisi();
        PuanlamaYontemi puanlama = new PuanlamaYontemi();
        strateji.yontemEkle(puanlama);
        KararAgaciYontemi kararAgaci = new KararAgaciYontemi();
        strateji.yontemEkle(kararAgaci);
        return strateji.degerlendir(vaka, hastalik);
    }
}
